extends Button

signal placed_instance(ready_instance:Node2D)

var spawner: Spawner = Spawner.new()
@export var spawned_instance:PackedScene
@export var max_instance_num:int = 4
@export var spawn_instances_once_num:int = 2

##这个节点唯一的作用就是让生成的实体坐标原点不是生成按钮的位置坐标，让实体可以紧跟鼠标
@onready var position_anchor: Node = $PositionAnchor
var dragged_component:DraggedByMouseComponent
var dragged_instance:Node2D

##这个bool值决定是否在本脚本中连接按下按钮信号至生成实体函数。
##为什么要有这个bool值？因为我们需要在游戏管理器中注册生成操作以实现撤消棋子的生成。
##因此，在is_self_control_spawn为false时，我们需要手动连接信号至管理器手动调用生成函数。
@export var is_self_control_spawn:bool = false

func _ready() -> void:
	spawner.init(spawned_instance,max_instance_num,spawn_instances_once_num)
	if is_self_control_spawn:
		button_down.connect(spawn_dragged_instance)

#region 放置实体相关
func _process(delta: float) -> void:
	if dragged_instance and Input.is_action_just_released("mouse_click_left"):
		_place_instance()

func _place_instance():
	dragged_component.placed_by_mouse()
	dragged_component.queue_free()
	placed_instance.emit(dragged_instance)
	dragged_instance = null
#endregion

#region 生成实体相关
func spawn_dragged_instance():
	spawn_instance()
	_make_instance_follow_mouse()

func spawn_instance():
	dragged_instance = spawner.request_instance()

func _make_instance_follow_mouse():
	position_anchor.add_child(dragged_instance)
	dragged_component = DraggedByMouseComponent.new()
	dragged_instance.add_child(dragged_component)
	dragged_component.dragged_by_mouse()
#endregion 

#region 回收相关
func recycle_instance(instance:Node2D):
	spawner.recycle_instance(instance)
#endregion
